//package com.xsj.consumer;
//
//import com.xsj.mapper.CardMapper;
//import com.xsj.pojo.Card;
//import com.xsj.vo.CardVO;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.dao.DuplicateKeyException;
//import org.springframework.messaging.Message;
//
//import java.util.Map;
//import java.util.function.Consumer;
//
///**
// * @BelongsProject: wisdom-restaurant-manage
// * @BelongsPackage: com.xsj.Consumer
// * @Author: tutu
// * @CreateTime: 2025-06-25 23:45
// * @Description: TODO
// * @Version: 1.0
// */
//
//@Configuration
//public class CouponOrderConsumer {
//    private static final Logger log = LoggerFactory.getLogger(CouponOrderConsumer.class);
//
//    @Autowired
//    private CardMapper cardMapper;
//
//    @Bean
//    public Consumer<Message<Map<String, Object>>> couponOrder() {
//        return message -> {
//            Map<String, Object> messagePayload = message.getPayload();
//            log.info("接收到创建卡券信息：{}", messagePayload);
//            try {
//                // 1. 从消息体中解析出数据
//                Long userId = ((Number) messagePayload.get("userId")).longValue();
//                Long cardId = ((Number) messagePayload.get("cardId")).longValue();
//
//                // 2. 获取卡券过期时间
//                Card cardDetails = cardMapper.getCardDetailsById(cardId.intValue());
//                if (cardDetails == null) {
//                    log.error("数据不一致：无法根据 cardId {} 找到卡券详情。消息将自动重试。", cardId);
//                    throw new RuntimeException("无法找到卡券详情，等待重试");
//                }
//
//                // 3. 构造插入数据库的实体对象
//                CardVO userCard = new CardVO();
//                userCard.setUserId(userId.intValue());
//                userCard.setCardId(cardId.intValue());
//                if (cardDetails.getEndTime() != null) {
//                    userCard.setExpireTime(new java.sql.Timestamp(cardDetails.getEndTime().getTime()));
//                }
//
//                // 4. 插入数据库（幂等性由 user_id 和 card_id 的联合唯一索引保证）
//                cardMapper.addCard(userCard);
//                log.info("用户 {} 领取卡券 {} 成功，已异步存入数据库。", userId, cardId);
//
//            } catch (DuplicateKeyException e) {
//                // 这是预期的幂等性异常，说明这条消息已经被成功处理过了。
//                log.warn("检测到重复消息（唯一键冲突），消息已被处理过，将忽略。消息内容: {}", messagePayload);
//            } catch (Exception e) {
//                log.error("处理卡券订单消息时发生未预期的异常, message: {}", messagePayload, e);
//                // 抛出异常以触发MQ的重试机制
//                throw new RuntimeException("消费消息失败，将重试", e);
//            }
//        };
//    }
//}
